package com.cencat.order.service;

import com.cencat.order.domain.Delivery;
import com.cencat.order.domain.DeliveryTrack;
import com.cencat.order.domain.DeliveryFeedback;
import com.cencat.order.domain.DeliveryException;
import com.cencat.order.domain.vo.DeliveryVO;
import com.cencat.order.domain.vo.DeliveryStatisticsVO;
import com.cencat.order.domain.vo.DeliveryAnalysisVO;
import com.cencat.order.domain.vo.DeliveryTrackVO;
import com.cencat.order.domain.dto.DeliveryCreateDTO;
import com.cencat.order.domain.dto.DeliveryUpdateDTO;
import com.cencat.order.domain.dto.DeliveryLocationDTO;
import com.cencat.order.domain.dto.DeliveryFeedbackDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 配送跟踪与反馈服务接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface IDeliveryService extends IService<Delivery> {

    /**
     * 查询配送订单列表
     * 
     * @param delivery 配送查询条件
     * @return 配送订单列表
     */
    List<Delivery> selectDeliveryList(Delivery delivery);

    /**
     * 获取配送订单详情
     * 
     * @param deliveryId 配送订单ID
     * @return 配送订单详情VO
     */
    DeliveryVO getDeliveryDetail(Long deliveryId);

    /**
     * 创建配送订单
     * 
     * @param createDTO 创建配送订单DTO
     * @return 配送订单详情VO
     */
    DeliveryVO createDelivery(DeliveryCreateDTO createDTO);

    /**
     * 更新配送订单
     * 
     * @param updateDTO 更新配送订单DTO
     * @return 是否成功
     */
    boolean updateDelivery(DeliveryUpdateDTO updateDTO);

    /**
     * 删除配送订单
     * 
     * @param deliveryIds 配送订单ID数组
     * @return 是否成功
     */
    boolean deleteDeliveryByIds(Long[] deliveryIds);

    /**
     * 配送状态管理
     */
    
    /**
     * 更新配送状态
     * 
     * @param deliveryId 配送订单ID
     * @param status 状态
     * @param remark 备注
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean updateDeliveryStatus(Long deliveryId, String status, String remark, Long operatorId);

    /**
     * 批量更新配送状态
     * 
     * @param deliveryIds 配送订单ID数组
     * @param status 状态
     * @param remark 备注
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean batchUpdateStatus(Long[] deliveryIds, String status, String remark, Long operatorId);

    /**
     * 司机接单
     * 
     * @param deliveryId 配送订单ID
     * @param driverId 司机ID
     * @param acceptTime 接单时间
     * @return 是否成功
     */
    boolean driverAcceptOrder(Long deliveryId, Long driverId, String acceptTime);

    /**
     * 开始配送
     * 
     * @param deliveryId 配送订单ID
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param startLocation 开始位置
     * @return 是否成功
     */
    boolean startDelivery(Long deliveryId, Long driverId, String startTime, String startLocation);

    /**
     * 到达取货点
     * 
     * @param deliveryId 配送订单ID
     * @param driverId 司机ID
     * @param arriveTime 到达时间
     * @param location 位置信息
     * @return 是否成功
     */
    boolean arrivePickupPoint(Long deliveryId, Long driverId, String arriveTime, String location);

    /**
     * 完成取货
     * 
     * @param deliveryId 配送订单ID
     * @param driverId 司机ID
     * @param pickupTime 取货时间
     * @param pickupProof 取货凭证
     * @return 是否成功
     */
    boolean completePickup(Long deliveryId, Long driverId, String pickupTime, String pickupProof);

    /**
     * 到达配送点
     * 
     * @param deliveryId 配送订单ID
     * @param driverId 司机ID
     * @param arriveTime 到达时间
     * @param location 位置信息
     * @return 是否成功
     */
    boolean arriveDeliveryPoint(Long deliveryId, Long driverId, String arriveTime, String location);

    /**
     * 完成配送
     * 
     * @param deliveryId 配送订单ID
     * @param driverId 司机ID
     * @param completeTime 完成时间
     * @param deliveryProof 配送凭证
     * @param recipientName 收货人姓名
     * @param recipientPhone 收货人电话
     * @return 是否成功
     */
    boolean completeDelivery(Long deliveryId, Long driverId, String completeTime, 
                           String deliveryProof, String recipientName, String recipientPhone);

    /**
     * 实时位置跟踪
     */
    
    /**
     * 更新配送位置
     * 
     * @param locationDTO 位置更新DTO
     * @return 是否成功
     */
    boolean updateDeliveryLocation(DeliveryLocationDTO locationDTO);

    /**
     * 获取配送轨迹
     * 
     * @param deliveryId 配送订单ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 轨迹列表
     */
    List<DeliveryTrack> getDeliveryTrack(Long deliveryId, String startTime, String endTime);

    /**
     * 获取实时位置
     * 
     * @param deliveryId 配送订单ID
     * @return 实时位置信息
     */
    Map<String, Object> getRealTimeLocation(Long deliveryId);

    /**
     * 批量获取配送状态
     * 
     * @param deliveryIds 配送订单ID列表
     * @return 状态信息列表
     */
    List<Map<String, Object>> batchGetDeliveryStatus(List<Long> deliveryIds);

    /**
     * 获取配送轨迹VO
     * 
     * @param deliveryId 配送订单ID
     * @return 轨迹VO
     */
    DeliveryTrackVO getDeliveryTrackVO(Long deliveryId);

    /**
     * 异常处理
     */
    
    /**
     * 上报配送异常
     * 
     * @param deliveryId 配送订单ID
     * @param exceptionType 异常类型
     * @param exceptionDesc 异常描述
     * @param reporterId 上报人ID
     * @param location 异常位置
     * @param images 异常图片
     * @return 异常ID
     */
    Long reportDeliveryException(Long deliveryId, String exceptionType, String exceptionDesc, 
                               Long reporterId, String location, String images);

    /**
     * 处理配送异常
     * 
     * @param exceptionId 异常ID
     * @param handleType 处理方式
     * @param handleDesc 处理描述
     * @param handlerId 处理人ID
     * @return 是否成功
     */
    boolean handleDeliveryException(Long exceptionId, String handleType, String handleDesc, Long handlerId);

    /**
     * 获取异常列表
     * 
     * @param deliveryId 配送订单ID
     * @param exceptionType 异常类型
     * @param status 处理状态
     * @return 异常列表
     */
    List<DeliveryException> getDeliveryExceptions(Long deliveryId, String exceptionType, String status);

    /**
     * 配送反馈管理
     */
    
    /**
     * 提交配送反馈
     * 
     * @param feedbackDTO 反馈DTO
     * @return 反馈ID
     */
    Long submitDeliveryFeedback(DeliveryFeedbackDTO feedbackDTO);

    /**
     * 获取配送反馈
     * 
     * @param deliveryId 配送订单ID
     * @return 反馈列表
     */
    List<DeliveryFeedback> getDeliveryFeedback(Long deliveryId);

    /**
     * 处理配送反馈
     * 
     * @param feedbackId 反馈ID
     * @param handleResult 处理结果
     * @param handlerId 处理人ID
     * @return 是否成功
     */
    boolean handleDeliveryFeedback(Long feedbackId, String handleResult, Long handlerId);

    /**
     * 配送评价
     * 
     * @param deliveryId 配送订单ID
     * @param rating 评分
     * @param comment 评价内容
     * @param evaluatorId 评价人ID
     * @param evaluatorType 评价人类型
     * @return 评价ID
     */
    Long evaluateDelivery(Long deliveryId, Integer rating, String comment, Long evaluatorId, String evaluatorType);

    /**
     * 统计分析
     */
    
    /**
     * 获取配送统计信息
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param dimension 统计维度
     * @param merchantId 商家ID
     * @return 统计信息VO
     */
    DeliveryStatisticsVO getDeliveryStatistics(String startDate, String endDate, String dimension, Long merchantId);

    /**
     * 获取配送效率分析
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param analysisType 分析类型
     * @return 效率分析VO
     */
    DeliveryAnalysisVO getDeliveryEfficiency(String startDate, String endDate, String analysisType);

    /**
     * 获取时效分析
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param timeType 时效类型
     * @return 时效分析数据
     */
    Map<String, Object> getTimeEfficiencyAnalysis(String startDate, String endDate, String timeType);

    /**
     * 获取成本分析
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param costType 成本类型
     * @return 成本分析数据
     */
    Map<String, Object> getCostAnalysis(String startDate, String endDate, String costType);

    /**
     * 获取质量分析
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param qualityType 质量类型
     * @return 质量分析数据
     */
    Map<String, Object> getQualityAnalysis(String startDate, String endDate, String qualityType);

    /**
     * 实时监控
     */
    
    /**
     * 获取实时配送监控
     * 
     * @param merchantId 商家ID
     * @return 实时监控数据
     */
    Map<String, Object> getRealTimeMonitoring(Long merchantId);

    /**
     * 获取配送预警
     * 
     * @param merchantId 商家ID
     * @param alertType 预警类型
     * @return 预警信息列表
     */
    List<Map<String, Object>> getDeliveryAlerts(Long merchantId, String alertType);

    /**
     * 设置配送预警
     * 
     * @param alertType 预警类型
     * @param alertRule 预警规则
     * @param merchantId 商家ID
     * @param notifyUsers 通知用户
     * @return 是否成功
     */
    boolean setDeliveryAlert(String alertType, String alertRule, Long merchantId, String notifyUsers);

    /**
     * 路径优化
     */
    
    /**
     * 优化配送路径
     * 
     * @param deliveryId 配送订单ID
     * @param optimizeType 优化类型
     * @return 优化结果
     */
    Map<String, Object> optimizeDeliveryRoute(Long deliveryId, String optimizeType);

    /**
     * 智能推荐
     * 
     * @param deliveryId 配送订单ID
     * @param recommendType 推荐类型
     * @return 推荐结果
     */
    List<Map<String, Object>> getDeliveryRecommendations(Long deliveryId, String recommendType);

    /**
     * 系统管理
     */
    
    /**
     * 性能优化
     * 
     * @param optimizationType 优化类型
     * @return 优化结果
     */
    Map<String, Object> optimizeDeliveryPerformance(String optimizationType);

    /**
     * 健康检查
     * 
     * @return 健康状态
     */
    Map<String, Object> deliveryHealthCheck();

    /**
     * 数据同步
     * 
     * @param syncType 同步类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 是否成功
     */
    boolean syncDeliveryData(String syncType, String startDate, String endDate);

    /**
     * 缓存刷新
     * 
     * @param cacheType 缓存类型
     * @return 是否成功
     */
    boolean refreshDeliveryCache(String cacheType);

    /**
     * 导入配送数据
     * 
     * @param deliveryList 配送列表
     * @return 导入结果消息
     */
    String importDeliveries(List<Delivery> deliveryList);

    /**
     * 获取司机配送统计
     * 
     * @param driverId 司机ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 司机统计数据
     */
    Map<String, Object> getDriverDeliveryStats(Long driverId, String startDate, String endDate);

    /**
     * 获取商家配送统计
     * 
     * @param merchantId 商家ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 商家统计数据
     */
    Map<String, Object> getMerchantDeliveryStats(Long merchantId, String startDate, String endDate);
}